 | | SISTEMAS DE REESCRITURA |
“Las reglas de reescritura son una forma simple y natural de describir cualquier clase de proceso no numérico” (J.A. Gognen)
“Pero solamente debe llamarse ‘interpretación’ a esto: sustituir una expresión de la regla por otra” (Wittgenstein. Investigaciones Filosóficas)
Definición
Un Sistema de Reescritura se compone de:
- Un conjunto de reglas (llamadas reglas de reescritura”), cuya forma general es:
expresión1 → expresión2 si condición
(la condición es opcional)
Abreviadamente, “p → q si c”, siendo p y q expresiones en general. Se puede leer como “p se reescribe como q” o “p se sustituye por q” o “p se reduce a q”, todas ellas bajo la condición c.
La flecha indica “sustitución”. Si la condición no existe, se tiene lo que se suele denominar “ecuación directa”, pero es mejor denominarla “sustitución pura” o “sustitución incondicional”.
- Un algoritmo o programa de control que realiza dos tareas. Primero, el análisis de cada regla para determinar si es aplicable. Segundo, cuando una regla es aplicable, realiza el proceso de sustitución en la expresión la parte izquierda de la regla por la parte derecha.
- Un contexto. El contexto de un Sistema de Reescritura es el entorno sobre el que se van a realizar las sustituciones. Pueden ser números, funciones, expresiones algebraicas, etc.
Reducción
El proceso de sustitución de una expresión que aparece en el lado izquierdo de una regla de reescritura por sus correspondiente lado derecho se denomina reducción. De tal forma que la evaluación de una expresión implica una secuencia de reducciones.
Si de a se deriva directamente b (a se reduce a b en un solo paso), se escribe a ⇒ b. Si de a se deriva b a través de varios pasos, se simboliza por a ⇒* b.
A partir de una expresión inicial a1, aplicando las reglas, se obtiene una secuencia de reducciones:
Cada paso discreto, de ai a ai+1 es una reducción. El último término, que no puede reducirse más se dice que está en “forma normal” y que la expresión es “residual”.
El término “reducción”, no obstante, es equívoco, pues puede ocurrir que ai+1 sea más grande que ai. Es más general usar el término “transformación” o “reescritura”.
Ejemplos
- En el contexto de las potencias del tipo xn, tenemos las tres reglas siguientes:
- xn → 1 si n=0
- xn → xn/2 × xn/2 si n es par
- xn → x × xn−1 en el resto de los casos
Ejemplo:
x5 ⇒ x × x4 ⇒ x × (x2 × x2) ⇒ x × ((x × x) × (x × x))
Se han aplicado sucesivamente las reglas 3, 2 y 2.
- El ejemplo más conocido de Sistema de Reescritura es el cálculo lambda. El contexto es el de las funciones lambda, junto con sus argumentos. La regla general consiste en sustituir los parámetros (identificados por el prefijo “λ” por los argumentos. Por ejemplo:
- (λx . 3x+y)4 ⇒ 12+y (sustituir x por 4 en la función λx.3x+y)
- (λxyz . x+y+z)(a, b, c) ⇒ a+b+c (sustitución paralela de x,y,z por a,b,c)
- (λx. λy. λz. x+y+z)abc ⇒ (λy. λz. a+y+z)bc ⇒ (λz. a+b+z)c ⇒ a+b+c
(sustituciones sucesivas, en serie)
- El sistema definido por las sustituciones directas
permiten representar todas las funciones computables y es la base los Combinadores Funcionales [ver Adenda].
Propiedades
Las dos propiedades más importantes de un Sistema de Reescritura son:
- Confluencia ( o propiedad de Church-Rosser).
Si existe más de una regla que puede aplicarse en cada punto del proceso, hay que considerar el orden o el criterio de selección de la regla a aplicar por parte del programa de control.
Un conjunto de reglas en las que el orden de aplicación de dichas reglas es indiferente se dice que es Church-Rosser. Esto significa que si existen dos reducciones del mismo término p a dos términos diferentes, q1 y q2, podemos encontrar otras dos reducciones desde estos términos hasta un mismo término r. La unicidad implica que el orden de aplicación de las reglas es indiferente.
- Normalización.
El proceso de aplicación de las reglas de reescritura puede terminar o no. Si realmente se alcanza un final (es decir, no se produce una secuencia infinita de reducciones), el conjunto de reglas se dice que es de terminación finita. Y todas las expresiones pueden alcanzar la forma normal.
Un Sistema de Reescritura que tenga estas dos propiedades (confluencia y normalización) se denomina “completo”.
Sistemas de Reescritura concretos y abstractos
Los Sistemas de Reescritura concretos son los que tienen una semántica definida a priori. En los Sistemas de Reescritura abstractos la semántica es libre, es decir, admiten muchas interpretaciones, llamadas “modelos”, como ocurre en el caso de los sistemas axiomáticos formales.
Muchos problemas o dominios, aparentemente diferentes, aparecen con una estructura formal análoga contemplados desde el paradigma de los Sistemas de Reescritura. De hecho, existen los llamados “Sistemas de Reducción Abstractos” (Abstract Reduction Systems, ARS), pues muchos aspectos de la reescritura se pueden estudiar independientemente de la naturaleza o semántica de los objetos.
Especificación en MENTAL
Forma general de una regla y proceso de evaluación
En MENTAL, una regla de reescritura se codifica mediante una expresión genérica, parametrizada o no:
〈( (expresión1 = expresión2) ← condición )〉
Al ser las reglas expresiones genéricas, se aplican automáticamente en todo momento por parte del intérprete de MENTAL, por lo que no es necesario un programa de control específico. Una expresión dada se autoevalúa si no puede aplicarse ninguna regla, o se evalúa a otra expresión como consecuencia del proceso de evaluación automático.
Las posibilidades de MENTAL como Sistema de Reescritura
MENTAL proporciona un modelo computacional completo, un marco genérico y flexible para definir sistemas de reescritura. He aquí algunas de sus posibilidades en este sentido:
- Las expresiones de sustitución pueden incluir todos los recursos lingüísticos disponibles. Podrían incluir sustituciones potenciales, funciones, tanto definiciones como aplicaciones, sustituciones relativas, nombres de expresiones, etc.
- Se pueden especificar condiciones a nivel de la expresión de sustitución completa o en cualquier subexpresión. También pueden especificarse condiciones anidadas.
- Pueden definirse todo tipo de contextos.
- Pueden definirse diferentes Sistemas de Reescritura interrelacionados, que compartan reglas.
- Pueden especificarse fácilmente Sistemas de Reescritura de orden superior, es decir, especificando reglas de reglas, de tal forma que una regla determinada se transforme sucesivamente durante el proceso de evaluación.
Ejemplos
- El ejemplo 1 anterior se codificaría así:
〈( (x^n = 1) ← n=0 )〉
〈( (x^n = (x^(n÷2) * x^(n÷2)) ) ← (n = (n÷2)*2) )〉
〈( (x^n = (x * x^(n−1)) ) ← n≠0 ← (n ≠ n÷2)*2) )〉
X^5 // ev. (x * x^4) ev. (x * x^2 * x^2) ev. (x*x*x*x*x)
Las 3 reglas realmente se podían codificar como una sola, con las condiciones jerarquizadas.
- Un ejemplo basado en funciones:
〈( (f(x y) = (g(x+y) g(x*y)) )〉 // no hay condición
〈( (g(x) = 24) ← x>10 )〉
〈( (g(x) = 12) ← x≤10 )〉
f(3 4) // ev. (g(7) g(12)) ev. (12 24)
f(1 1) // ev. (g(2) g(1)) ev. (12 12)
Adenda
Orígen
Los Sistemas de Reescritura surgieron históricamente del cálculo lambda y de la lógica combinatoria. Están desempeñando un importante papel como modelo teórico de computación, principalmente en el área de los lenguajes funcionales. Sus principales atractivos son su carácter genérico y su simplicidad.
Los Sistemas de Reescritura constituyen un formalismo de programación totalmente genérico que sirve para especificar cualquier función computable, como han demostrado Bergstra y Tucker [1985]. Pero al basarse solo en dos primitivas conceptuales (la sustitución y la condición), impide que se convierta en un lenguaje universal.
Según Gognen [1984], “las reglas de reescritura constituyen una forma simple y natural de describir cualquier clase de proceso no numérico”.
Relaciones con otros dominios y aplicaciones
- Fundamentación de la Informática.
Por su carácter genérico, sirve de base a los lenguajes de programación, especialmente los funcionales.
- Procesos.
Un proceso informático se puede considerar un proceso de reducción (o transformación) de una entrada en una salida.
- Gramáticas.
Un Sistema de Reescritura basado en sustituciones incondicionales del tipo p→q, en donde p y q son cadenas de símbolos, equivale a una gramática de tipo cero, la gramática más general de la clasificación de Chomsky. Las reglas de la gramática se denominan, en este caso, reglas de producción.
- Máquina de Turing.
Los Sistema de Reescritura, con reglas (incluyendo condiciones), permiten representar máquinas de Turing.
- Evaluación parcial.
Existe una estrecha relación entre los sistemas de reescritura y la evaluación parcial, puesto que una reducción se puede considerar un proceso de especialización, realizada mediante una función especializadora (el programa de control y utilizando una regla determinada) y que produce una expresión residual resultante.
- Sistemas expertos.
El conjunto de reglas de un Sistema de Reescritura pueden representar el conocimiento de un experto de un cierto dominio.
- Sistemas axiomáticos formales.
Existes analogías entre un Sistema de Reescritura y un sistema axiomático formal:
- Las reglas son a la vez los axiomas y las reglas de derivación.
- Las expresiones derivadas son los teoremas.
- Una demostración de un teorema es una secuencia de reducciones.
- Al estar la semántica abierta, pueden existir diferentes modelos interpretativos de un mismo sistema.
- Álgebra Universal.
Cálculo ecuacional con axiomas (sustitución, aplicación, transitividad, reflexividad y simetría).
Otras aplicaciones de los Sistemas de Reescritura son: especificación algebraica, teoría de la recursión, demostración automática de teoremas, transformación de programas, verificación de programas, traducción automática, compiladores, proceso del lenguaje natural, teoría de autómatas, proceso de señales, sistemas evolutivos, etc.
Lenguaje OBJ
OBJ [Gognen, 1979] es un lenguaje de muy alto nivel que se basa en reglas de reescritura, que se llaman “ecuaciones lógicas” y el sistema lógico correspondiente se denomina “lógica ecuacional”.
En OBJ la forma sintáctica de una regla de reescritura es
(expresión1 = expresión2 IF expresiónCondicional)
Una característica interesante de OBJ es su sintaxis flexible en la que es posible definir operaciones prefijas, postfijas, infijas y mixfijas. Las operaciones mixfijas son las más generales. El término “mixfija” se debe a P. Mosses (también se usa la palabra “distfija”, en la que “dist” indica distribuida) y se refiere a la posibilidad de especificar operandos mezclados con símbolos u otras palabras. Por ejemplo, IF_THEN_ELSE_FI es la declaración mixfija correspondiente a “condicional”, en donde los guiones bajos corresponden a los operandos.
Combinadores funcionales
Los combinadores funcionales tienen su origen en dos ideas principales:
- Poder expresar las funciones mediante otras funciones, sin necesidad de usar variables.
- Poder expresar las funciones mediante el menor número de funciones primitivas.
La idea de eliminar variables en las funciones tiene su origen en las ideas de Moses Schönfinkel, que en los 1920s desarrolló el llamado “cálculo funcional”.
Curry desarrolló la misma idea, independientemente, bajo el nombre de “lógica combinatoria” [Curry, 1958, 1971].
Por ejemplo, si tenemos las funciones
Axy = x+y (adición)
Mxy = x·y (multiplicación)
y definimos la función
entonces F se puede expresar como
La asociatividad se supone a la derecha, es decir,
Si definimos una nueva función
en donde los argumentos pueden representar funciones, se tiene que
Por lo tanto, F = QAM es una nueva función que puede definirse a partir de las funciones Q, A y M, desapareciendo las variables en su definición y expresándose sólo mediante otras funciones.
Schönfinkel descubrió que era suficiente con introducir dos formas combinatorias (combinadores) primitivas para expresar cualquier función, sin necesidad de variables:
La primera se puede considerar la distribución de z sobre x e y.
La segunda es la reducción o eliminación del segundo argumento o la proyección sobre el primer argumento.
Por ejemplo, la función identidad Ix = x es una función derivada, pues se puede expresar mediante las dos primitivas: I = SKK
En efecto,
Ix = SKKx = S(KKx) = Kx(Kx) = x
Bibliografía
- Bergstra, J.A.; Tucker, J.V. Algebric specifications of computable and semicomputable data structures. Theoretical Comput. Sci., 1985.
- Boader, F; Nipkow, T. Term Rewriting and All That. Cambridge University Press, 1998.
- Curry, Haskell B. y Feys, Richard. Combinatory Logic, 1. North Holland, Amsterdam, 1958.
- Curry, H.B.; Hindley, J.R.; Seldin, J. Combinatory Logic, 2. North-Holland Pub. Co., Amsterdam, 1971.
- Dershowitz, N; Jouannaud, J.P. Rewrite Systems. Handbook of Theoretical Computer Science, vol. B., pp. 243-320, 1990. [Texto estándar].
- Gognen, J.A.; Tardo, J. An introduction to OBJ: A language for writing, and testing software specifications. Specification of Reliable Software. New York: IEEE Press, 1979, pp. 170-179.
- Gognen, J.A. Parameterized Programming. IEEE Transactions on Software Engineering, vol. SE-10, No. 5, Sept. 1984.
- Huet, G.; Oppen, D.C. Equations and rewrite rules: a survey. R. V. Book (ed.), Academic Press, 1980. [Una visión general de las reglas de reescritura].
- Klop, Jan Willem. Term Rewriting Systems. Handbook of Logic in Computer Science, vol. 2, pp. 2-116. Oxford University Press, 1992. [Texto estándar].
- Lüth, Christoph. Categorial Term Rewriting: Monads and Modularity. Internet, 1997.
- Nipkow, T. Higher-order critical pairs. Proceedings of the Sixth Annual IEEE Symposium on Logic in Computer Science, pp. 342-349. IEEE Computer Society Press, 1991.
- Ohlebush, E. Advanced Topics in Term Rewriting. Springer, New York, 2002.
- Terese. Term Rewriting Systems. Cambridge Tracts in Theoretical Computer Science, vol. 55. Cambridge University Press, 2003. [Muy completo. Escrito por diferentes autores. Terese es un pseudónimo del Dutch Research Community on Term Rewriting, impulsor del libro].